package com.example.algorithm.sort;

import java.util.Arrays;

/**
 * 快速排序
 *
 * @author yuzhenxin
 * @date 2023/5/11
 */
public class QuickSort {

    public static void main(String[] args) {
        int[] nums = {5, 3, 7, 2, 4};
        sort(nums);
        System.out.println(Arrays.toString(nums));
    }

    public static void sort(int[] nums) {
        sort(nums, 0, nums.length - 1);
    }

    public static void sort(int[] nums, int left, int right) {
        if (left >= right) {
            return;
        }

        // 取第一个数为分隔数
        int pivot = nums[left];
        int i = left, j = right;

        // 循环结束后，分隔数左边都小于等于分隔数，右边都大于等于分隔数（升序）
        while (i < j) {
            // 找到右边第一个比分隔数小的数
            while (i < j && nums[j] >= pivot) {
                j--;
            }
            if (i < j) {
                nums[i] = nums[j];
                i++;
            }

            // 找到左边第一个比分隔数大的数
            while (i < j && nums[i] <= pivot) {
                i++;
            }
            if (i < j) {
                nums[j] = nums[i];
                j--;
            }
        }
        // i = j了
        nums[i] = pivot;

        sort(nums, left, i - 1);
        sort(nums, i + 1, right);
    }
}
